package com.learn.datatype;

import java.util.HashMap;
import java.util.Map;

/**
 * 功能：判断数据类型，简单类型 or 复杂类型（并区分常见对象）
 *
 * @author wsh
 * @date 2020/12/22
 */
public class DataTypeTools {
    /**
     * 功能：判断基本类型
     *
     * @param o
     * @return
     * @author wsh
     * @date 2020/12/22
     */
    public static Map<String, String> getType(byte o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "basic");
        map.put("type", "byte");
        return map;
    }
    public static Map<String, String> getType(short o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "basic");
        map.put("type", "short");
        return map;
    }
    public static Map<String, String> getType(int o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "basic");
        map.put("type", "int");
        return map;
    }
    public static Map<String, String> getType(long o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "basic");
        map.put("type", "long");
        return map;
    }
    public static Map<String, String> getType(float o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "basic");
        map.put("type", "float");
        return map;
    }
    public static Map<String, String> getType(double o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "basic");
        map.put("type", "double");
        return map;
    }
    public static Map<String, String> getType(boolean o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "basic");
        map.put("type", "boolean");
        return map;
    }
    public static Map<String, String> getType(char o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "basic");
        map.put("type", "char");
        return map;
    }

    /**
     * <pre>
     * 功能：判断复杂类型（对象）
     * 常见对象：
     * 1、特殊类型 null
     * 2、基本类型包装类
     * 3、String
     * 4、数组
     * </pre>
     *
     * @param o
     * @return
     * @author wsh
     * @date 2020/12/22
     */
    public static Map<String, String> getType(Object o) {
        Map<String, String> map = new HashMap<>();
        map.put("group", "object");

        if (o == null) {
            map.put("type", "null");
            return map;
        }

        // 判断八大基本类型的包装类
        if (Byte.class.isInstance(o)) {
            map.put("type", "Byte");
            return map;
        } else if (Short.class.isInstance(o)) {
            map.put("type", "Short");
            return map;
        } else if (Integer.class.isInstance(o)) {
            map.put("type", "Integer");
            return map;
        } else if (Long.class.isInstance(o)) {
            map.put("type", "Long");
            return map;
        } else if (Float.class.isInstance(o)) {
            map.put("type", "Float");
            return map;
        } else if (Double.class.isInstance(o)) {
            map.put("type", "Double");
            return map;
        } else if (Boolean.class.isInstance(o)) {
            map.put("type", "Boolean");
            return map;
        } else if (Character.class.isInstance(o)) {
            map.put("type", "Character");
            return map;
        }

        if (String.class.isInstance(o)) {
            // String
            map.put("type", "String");
            return map;
        } else if (o.getClass().isArray()) {
            // Array
            map.put("type", "Array");
            map.put("typeDetail", o.getClass().getComponentType().getSimpleName());
            return map;
        }

        map.put("type", o.getClass().getSimpleName());
        return map;
    }
}
